package com.actionbarsherlock.internal.view.menu;

import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View;
import com.actionbarsherlock.internal.view.ActionProviderWrapper;
import com.actionbarsherlock.internal.widget.CollapsibleActionViewWrapper;
import com.actionbarsherlock.view.ActionProvider;
import com.actionbarsherlock.view.CollapsibleActionView;
import com.actionbarsherlock.view.MenuItem;
import com.actionbarsherlock.view.SubMenu;

public class MenuItemWrapper implements MenuItem, android.view.MenuItem.OnMenuItemClickListener {
    private final android.view.MenuItem mNativeItem;
    private SubMenu mSubMenu = null;
    private OnMenuItemClickListener mMenuItemClickListener = null;
    private OnActionExpandListener mActionExpandListener = null;
    private android.view.MenuItem.OnActionExpandListener mNativeActionExpandListener = null;


    public MenuItemWrapper(android.view.MenuItem nativeItem) {
        if (nativeItem == null) {
            throw new IllegalStateException("Wrapped menu item cannot be null.");
        }
        mNativeItem = nativeItem;
    }


    @Override
    public int getItemId() {
        return mNativeItem.getItemId();
    }

    @Override
    public int getGroupId() {
        return mNativeItem.getGroupId();
    }

    @Override
    public int getOrder() {
        return mNativeItem.getOrder();
    }

    @Override
    public MenuItem setTitle(CharSequence title) {
        mNativeItem.setTitle(title);
        return this;
    }

    @Override
    public MenuItem setTitle(int title) {
        mNativeItem.setTitle(title);
        return this;
    }

    @Override
    public CharSequence getTitle() {
        return mNativeItem.getTitle();
    }

    @Override
    public MenuItem setTitleCondensed(CharSequence title) {
        mNativeItem.setTitleCondensed(title);
        return this;
    }

    @Override
    public CharSequence getTitleCondensed() {
        return mNativeItem.getTitleCondensed();
    }

    @Override
    public MenuItem setIcon(Drawable icon) {
        mNativeItem.setIcon(icon);
        return this;
    }

    @Override
    public MenuItem setIcon(int iconRes) {
        mNativeItem.setIcon(iconRes);
        return this;
    }

    @Override
    public Drawable getIcon() {
        return mNativeItem.getIcon();
    }

    @Override
    public MenuItem setIntent(Intent intent) {
        mNativeItem.setIntent(intent);
        return this;
    }

    @Override
    public Intent getIntent() {
        return mNativeItem.getIntent();
    }

    @Override
    public MenuItem setShortcut(char numericChar, char alphaChar) {
        mNativeItem.setShortcut(numericChar, alphaChar);
        return this;
    }

    @Override
    public MenuItem setNumericShortcut(char numericChar) {
        mNativeItem.setNumericShortcut(numericChar);
        return this;
    }

    @Override
    public char getNumericShortcut() {
        return mNativeItem.getNumericShortcut();
    }

    @Override
    public MenuItem setAlphabeticShortcut(char alphaChar) {
        mNativeItem.setAlphabeticShortcut(alphaChar);
        return this;
    }

    @Override
    public char getAlphabeticShortcut() {
        return mNativeItem.getAlphabeticShortcut();
    }

    @Override
    public MenuItem setCheckable(boolean checkable) {
        mNativeItem.setCheckable(checkable);
        return this;
    }

    @Override
    public boolean isCheckable() {
        return mNativeItem.isCheckable();
    }

    @Override
    public MenuItem setChecked(boolean checked) {
        mNativeItem.setChecked(checked);
        return this;
    }

    @Override
    public boolean isChecked() {
        return mNativeItem.isChecked();
    }

    @Override
    public MenuItem setVisible(boolean visible) {
        mNativeItem.setVisible(visible);
        return this;
    }

    @Override
    public boolean isVisible() {
        return mNativeItem.isVisible();
    }

    @Override
    public MenuItem setEnabled(boolean enabled) {
        mNativeItem.setEnabled(enabled);
        return this;
    }

    @Override
    public boolean isEnabled() {
        return mNativeItem.isEnabled();
    }

    @Override
    public boolean hasSubMenu() {
        return mNativeItem.hasSubMenu();
    }

    @Override
    public SubMenu getSubMenu() {
        if (hasSubMenu() && (mSubMenu == null)) {
            mSubMenu = new SubMenuWrapper(mNativeItem.getSubMenu());
        }
        return mSubMenu;
    }

    @Override
    public MenuItem setOnMenuItemClickListener(OnMenuItemClickListener menuItemClickListener) {
        mMenuItemClickListener = menuItemClickListener;
        //Register ourselves as the listener to proxy
        mNativeItem.setOnMenuItemClickListener(this);
        return this;
    }

    @Override
    public boolean onMenuItemClick(android.view.MenuItem item) {
        if (mMenuItemClickListener != null) {
            return mMenuItemClickListener.onMenuItemClick(this);
        }
        return false;
    }

    @Override
    public ContextMenuInfo getMenuInfo() {
        return mNativeItem.getMenuInfo();
    }

    @Override
    public void setShowAsAction(int actionEnum) {
        mNativeItem.setShowAsAction(actionEnum);
    }

    @Override
    public MenuItem setShowAsActionFlags(int actionEnum) {
        mNativeItem.setShowAsActionFlags(actionEnum);
        return this;
    }

    @Override
    public MenuItem setActionView(View view) {
        if (view != null && view instanceof CollapsibleActionView) {
            view = new CollapsibleActionViewWrapper(view);
        }
        mNativeItem.setActionView(view);
        return this;
    }

    @Override
    public MenuItem setActionView(int resId) {
        //Allow the native menu to inflate the resource
        mNativeItem.setActionView(resId);
        if (resId != 0) {
            //Get newly created view
            View view = mNativeItem.getActionView();
            if (view instanceof CollapsibleActionView) {
                //Wrap it and re-set it
                mNativeItem.setActionView(new CollapsibleActionViewWrapper(view));
            }
        }
        return this;
    }

    @Override
    public View getActionView() {
        View actionView = mNativeItem.getActionView();
        if (actionView instanceof CollapsibleActionViewWrapper) {
            return ((CollapsibleActionViewWrapper)actionView).unwrap();
        }
        return actionView;
    }

    @Override
    public MenuItem setActionProvider(ActionProvider actionProvider) {
        mNativeItem.setActionProvider(new ActionProviderWrapper(actionProvider));
        return this;
    }

    @Override
    public ActionProvider getActionProvider() {
        android.view.ActionProvider nativeProvider = mNativeItem.getActionProvider();
        if (nativeProvider != null && nativeProvider instanceof ActionProviderWrapper) {
            return ((ActionProviderWrapper)nativeProvider).unwrap();
        }
        return null;
    }

    @Override
    public boolean expandActionView() {
        return mNativeItem.expandActionView();
    }

    @Override
    public boolean collapseActionView() {
        return mNativeItem.collapseActionView();
    }

    @Override
    public boolean isActionViewExpanded() {
        return mNativeItem.isActionViewExpanded();
    }

    @Override
    public MenuItem setOnActionExpandListener(OnActionExpandListener listener) {
        mActionExpandListener = listener;

        if (mNativeActionExpandListener == null) {
            mNativeActionExpandListener = new android.view.MenuItem.OnActionExpandListener() {
                @Override
                public boolean onMenuItemActionExpand(android.view.MenuItem menuItem) {
                    if (mActionExpandListener != null) {
                        return mActionExpandListener.onMenuItemActionExpand(MenuItemWrapper.this);
                    }
                    return false;
                }

                @Override
                public boolean onMenuItemActionCollapse(android.view.MenuItem menuItem) {
                    if (mActionExpandListener != null) {
                        return mActionExpandListener.onMenuItemActionCollapse(MenuItemWrapper.this);
                    }
                    return false;
                }
            };

            //Register our inner-class as the listener to proxy method calls
            mNativeItem.setOnActionExpandListener(mNativeActionExpandListener);
        }

        return this;
    }
}
